//
//  FXEvent.swift
//  FXEvent
//
//  Created by fanxiaoxin_1987@126.com on 11/22/2021.
//  Copyright (c) 2021 fanxiaoxin_1987@126.com. All rights reserved.
//

import Foundation

/// 普通事件，自己手动触发，可配合代理事件做自动触发
open class FXEvent<ParameterType>: FXEventType {
    let handleOpQueue = DispatchQueue(label: "__fxEvent_handles")
    internal var handles: [FXEventHandle<ParameterType>] = []
    /// 开关，关闭的时候不会触发事件，但不影响添加删除事件处理
    open var isEnabled: Bool = true
    /// 判断是否包含事件处理
    open var isEmpty: Bool {
        return self.handles.count == 0
    }
    /// 需要显示声明public
    public init() { }
    /// 添加事件处理
    open func addTarget(_ target: AnyObject, action: Selector) {
        handleOpQueue.async {
            self.handles.append(.target(target, action))
        }
    }
    /// 移除事件处理
    open func removeTarget(_ target: AnyObject, action: Selector) {
        handleOpQueue.async {
            self.handles.removeAll(where: { $0 == .target(target, action)})
        }
    }
    /// 移除事件处理
    open func removeTarget(_ target: AnyObject) {
        handleOpQueue.async {
            self.handles.removeAll(where: { $0.target === target })
        }
    }
    /// 添加事件处理
    open func addBlock(_ identifier: String, block: @escaping (ParameterType) -> Void) {
        handleOpQueue.async {
            if !self.handles.contains(where: { $0.identifier == identifier }) {
                self.handles.append(.block(identifier,block))
            }
        }
    }
    /// 添加事件处理
    open func addBlock(_ block: @escaping (ParameterType) -> Void) {
        handleOpQueue.async {
            self.handles.append(.block(nil, block))
        }
    }
    /// 移除事件处理
    open func removeBlock(_ identifier: String) {
        handleOpQueue.async {
            self.handles.removeAll(where: { $0.identifier == identifier })
        }
    }
    /// 移除全部事件处理
    open func removeAllActions() {
        handleOpQueue.async {
            self.handles.removeAll()
        }
    }
    /// 触发事件
    open func sendActions(for parameter: ParameterType) {
        if self.isEnabled {
            self.handles.forEach({ $0.execute(for: parameter) })
        }
    }
}
